home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / comm1 / mscan.lha / MSCAN.ASM < prev    next >
Assembly Source File  |  1996-01-22  |  27KB  |  616 lines

  1. ;***** MSCAN V1.0 Source Code
  2. ;***** Quick message scan door for MAXsBBS V1.52+
  3. ;***** by Keith Bennett and Glen Martin 1996
  4. ;***** Last updated: 22-JAN-1996
  5.  
  6. ;get some library offsets and constants
  7.  
  8.            include "Assempro:Includes/exec.offsets"
  9.            include "Assempro:Includes/dos.offsets"
  10. mode_old   equ     1005
  11.  
  12. ;set up some macros for library calls
  13.  
  14. callsys:   macro   $\1                   ;macro for exec lib calls
  15.            jsr     _LVO\1(a6)
  16.            endm
  17. calldos:   macro   $\1                   ;macro for dos lib calls
  18.            move.l  doslibbase(pc),a6
  19.            jsr     _LVO\1(a6)
  20.            move.w  #4,a6
  21.            move.l  (a6),a6
  22.            endm
  23.  
  24.            bra     begin                 ;vanity embedding
  25.            dc.b    "MSCAN V1.0 for MAXsBBS "
  26.            dc.b    "by Keith Bennett and Glen Martin 1996."
  27.            align
  28.  
  29. ;***** START OF PROGRAM *****
  30.  
  31. begin:     nop                           ;do nothing!
  32.            lea     InitialSP(PC),a5      ;store the current stack pointer
  33.            move.l  sp,(a5)               ;in case we exit from a subroutine
  34.  
  35.            move.w  #4,a6                 ;get the exec library base in a6
  36.            move.l  (a6),a6
  37.  
  38. ;***** READ SELECTED SECTION NUMBERS
  39.  
  40.            subq.l  #1,d0                 ;did we get anything from the launch?
  41.            beq     exit1                 ;if not then lets get out of here
  42.            move.b  #255,d7               ;set section number error flag
  43.            subq.l  #1,d0                 ;are there any parameters
  44.            beq     getnoden              ;nope, then skip 
  45.            clr.l   d7                    ;reset section number error flag
  46.            move.l  a0,a1                 ;start of paramenters to a1
  47.  
  48.            lea     sections(PC),a2       ;point to section selection list
  49.            clr.l   d3
  50. paraloop:  bsr     readnum               ;read next section number
  51.            tst.b   d7                    ;any error?
  52.            bmi     getnoden              ;yes
  53.            move.b  #1,(a2,d1)            ;set section as selected
  54. backsep:   move.b  (a1)+,d2              ;read next character
  55.            beq     getnoden              ;end of parameters
  56.            cmp.b   #" ",d2               ;is it a space?
  57.            beq     getnoden              ;yes, end of parameters
  58.            cmp.b   #",",d2               ;is it a comma?
  59.            beq     paraloop              ;yes, read next section
  60.            move.b  #255,d7               ;set error flag
  61.            cmp.b   #"-",d2               ;is it a dash? (range)
  62.            bne     getnoden              ;no, (error)
  63.            clr.l   d7                    ;reset error flag
  64.            move.b  d1,d3                 ;remember previous number
  65.            bsr     readnum               ;read next section number
  66.            tst.b   d7                    ;any error?
  67.            bmi     getnoden              ;yes
  68. sloop:     cmp.b   d1,d3                 ;compare the values
  69.            bhs     backsep               ;end of range?
  70.            move.b  #1,(a2,d3)            ;set section as selected
  71.            addq    #1,d3                 ;increment section number
  72.            bra     sloop                 ;loop until range is selected
  73.  
  74. ;***** SET UP MESSAGE PORTS TO/FROM MAXS BBS
  75.  
  76. getnoden:  add.l   d0,a0                 ;point a0 to node number
  77.            lea     msgportn1+11(PC),a5   ;load the node number into the
  78.            move.b  (a0),(a5)             ;message control port name
  79.            lea     msgportn2+9(PC),a5    ;and the reply port name
  80.            move.b  (a0),(a5)
  81.  
  82.            move.l  #140,d0               ;get some ram for the message port
  83.            move.l  #$10001,d1
  84.            callsys allocmem
  85.            lea     msgport(PC),a5
  86.            move.l  d0,(a5)
  87.            beq     exit1                 ;cant get it? then exit
  88.  
  89.            sub.l   a1,a1                 ;find out who am I
  90.            callsys findtask
  91.            move.l  (a5),a0
  92.  
  93.            move.l  d0,16(a0)             ;get ourself a free signal
  94.            moveq   #-1,d0
  95.            callsys allocsignal
  96.            move.l  (a5),a1
  97.  
  98.            move.b  #4,8(a1)              ;set up the message port
  99.            lea     msgportn2(PC),a5
  100.            move.l  a5,10(a1)
  101.            move.b  d0,15(a1)
  102.            bmi     exit2                 ;if no free signals then exit
  103.            move.b  #5,42(a1)
  104.            move.l  a1,48(a1)
  105.            move.w  #106,52(a1)
  106.            callsys addport               ;add our message port
  107.  
  108.            callsys forbid                ;find max's control port
  109.            lea     msgportn1(PC),a1
  110.            callsys findport
  111.            lea     contport(PC),a5
  112.            move.l  d0,(a5)
  113.            callsys  permit
  114.            tst.l   (a5)
  115.            beq     exit3                 ;if we cant find it then exit
  116.  
  117. ;***** INITIALISE EVERYTHING
  118.  
  119.            lea     doslibname(PC),a1     ;open dos library
  120.            sub.l   d0,d0
  121.            callsys openlibrary
  122.            lea     doslibbase(PC),a5
  123.            move.l  d0,(a5)
  124.            beq     cleanup               ;if we cant open it then exit
  125.  
  126.            move.l  bufflen(PC),d0        ;get some ram for the file buffer
  127.            move.l  #$10000,d1
  128.            callsys allocmem
  129.            lea     filebuff(PC),a5
  130.            lea     txt07(PC),a0
  131.            move.l  d0,(a5)
  132.            beq     endit                 ;cant get it? then error and exit
  133.  
  134.            moveq   #8,d0                 ;ask max for the BBS path
  135.            lea     textbuff(PC),a3
  136.            bsr     getstring
  137.            subq    #1,a2                 ;add on max's config filename
  138.            lea     confname(PC),a0
  139. loop02:    move.b  (a0)+,(a2)+
  140.            bne     loop02
  141.            bsr     openf                 ;open max's config file
  142.            lea     txt03(PC),a0
  143.            tst.l   d0                    ;was the open successful?
  144.            beq     endit                 ;no, show error and exit
  145.            move.l  d0,d1                 ;seek through max's config file to
  146.            move.l  #144,d2               ;the message base path
  147.            moveq   #-1,d3
  148.            calldos seek
  149.            move.l  filehand(PC),d1       ;read the message base path
  150.            lea     textbuff(PC),a0
  151.            move.l  a0,d2
  152.            moveq   #41,d3
  153.            calldos read
  154.            lea     txt03(PC),a0
  155.            tst.l   d0                    ;did it read ok?
  156.            bmi     endit                 ;no, show error and exit
  157.            move.l  filehand(PC),d1       ;close max's config file
  158.            calldos close
  159.            lea     filehand(PC),a0       ;clear filehandle
  160.            clr.l   (a0)
  161.            lea     textbuff(PC),a0       ;point to end of message base path
  162. loop03:    move.b  (a0)+,d0
  163.            bne     loop03
  164.            subq    #1,a0
  165.            lea     msgname(PC),a1        ;add on message.data filename
  166. loop04:    move.b  (a1)+,(a0)+
  167.            bne     loop04
  168.            bsr     openf                 ;open message.data file
  169.            lea     txt04(PC),a0
  170.            tst.l   d0                    ;did it open ok?
  171.            beq     endit                 ;no, show error and exit
  172.            move.l  d0,d1                 ;seek though the message.data file to
  173.            move.l  #470,d2               ;the message records
  174.            move.l  #-1,d3
  175.            calldos seek
  176.  
  177.            lea     username(PC),a3       ;get user's username from max
  178.            moveq   #1,d0
  179.            bsr     getstring
  180.  
  181.            lea     accessl(PC),a3        ;get user's access level from max
  182.            moveq   #1,d0
  183.            bsr     getint
  184.  
  185.            lea     pagelen(PC),a3        ;get user's page length from max
  186.            moveq   #9,d0
  187.            bsr     getint
  188.  
  189.            lea     txt01(PC),a0          ;point to error text
  190.            cmp.b   #255,d7               ;is d7 error staus? (255)
  191.            beq     endit                 ;yes, display error and exit
  192.  
  193. ;***** THE MAIN BIT
  194.  
  195.            lea     txt05(PC),a0          ;print heading
  196.            bsr     print
  197.            lea     txt11(PC),a0          ;underline the heading
  198.            bsr     print
  199.            lea     txt11(PC),a0
  200.            bsr     print
  201.            lea     txt02(PC),a0          ;and print a CR
  202.            bsr     print
  203.            clr.l   d6                    ;clear message counter
  204.            moveq   #6,d4                 ;set initial number of lines displayed
  205.  
  206. mainloop:  move.l  filehand(PC),d1       ;read next block of message data
  207.            move.l  filebuff(PC),d2
  208.            move.l  bufflen(PC),d3
  209.            calldos read
  210.            lea     txt04(PC),a0
  211.            move.l  d0,d5                 ;get number of bytes read
  212.            bmi     endit                 ;error reading
  213.            beq     eof                   ;end of file
  214.            move.l  filebuff(PC),a4       ;point to start of message data
  215.  
  216. secdloop:  btst    #0,27(a4)             ;deleted message?
  217.            bne     next                  ;yes, next message
  218.            lea     sections(PC),a0       ;point to selections
  219.            move.b  28(a4),d7             ;read section number from message
  220.            tst.b   (a0,d7)               ;it it selected?
  221.            beq     next                  ;no, then next message
  222.            tst.b   d7                    ;private section?
  223.            bne     display               ;nope
  224.            move.l  accessl(PC),d0        ;check access level
  225.            cmp.w   #4999,d0              ;sysops see all private messages
  226.            bhi     display
  227.            lea     70(a4),a0             ;is it to user?             
  228.            bsr     checkusrn
  229.            tst.l   d0
  230.            bne     display               ;yes, display it
  231.            lea     29(a4),a0             ;is it from user?
  232.            bsr     checkusrn
  233.            tst.l   d0
  234.            beq     next                  ;no, next message
  235.  
  236. display:   move.l  (a4),d0               ;read message number
  237.            bsr     hxtoa                 ;convert to ASCII
  238.            move.l  a1,a0                 ;point to ASCII number
  239.            lea     textbuff(PC),a1       ;point to text buffer
  240.            lea     color1(PC),a2         ;point to ANSI color code
  241.            moveq   #8,d0                 ;set column width
  242.            bsr     makeseg               ;make first column
  243.            lea     183(a4),a0            ;point to from alias
  244.            move.b  (a0),d0               ;is there an alias?
  245.            bne     fromalias             ;yes, skip
  246.            lea     29(a4),a0             ;no, point to to username
  247. fromalias: lea     color2(PC),a2         ;point to from ANSI color code
  248.            moveq   #20,d0                ;set column width
  249.            bsr     makeseg               ;make the from column
  250.            move.b  #0,(a1)               ;terminate line
  251.            lea     textbuff(PC),a0       ;print 1st half of line
  252.            bsr     print                 ;(we need to print this line in 2 parts
  253.            lea     textbuff(PC),a1       ; so we don't overrun the message port)
  254.            lea     224(a4),a0            ;point to to alias
  255.            move.b  (a0),d0               ;is there a to alias?
  256.            bne     toalias               ;yes, skip
  257.            lea     70(a4),a0             ;no, point to to username
  258. toalias:   lea     color3(PC),a2         ;point to ANSI color code
  259.            moveq   #20,d0                ;set column width
  260.            bsr     makeseg               ;make the to column
  261.            lea     111(a4),a0            ;point to subject
  262.            lea     color4(PC),a2         ;point to ANSI color code
  263.            moveq   #31,d0                ;set column width
  264.            bsr     makeseg               ;make the last column
  265.            move.b  #13,(a1)+             ;add CR to line
  266.            move.b  #0,(a1)               ;terminate line
  267.            lea     textbuff(PC),a0       ;print 2nd half of line
  268.            bsr     print
  269.  
  270.            addq    #1,d6                 ;increment message counter
  271.            addq    #1,d4                 ;increment line count
  272.            cmp.l   pagelen(PC),d4        ;end of page?
  273.            blo     next                  ;no, next message
  274.            lea     txt09(PC),a0          ;display hit return to continue...
  275.            bsr     hotkey                ;wait for user to press key
  276.            cmp.b   #'S',d0               ;did user hit 'S' to stop?
  277.            beq     eof                   ;yes, jump to end bit
  278.            lea     txt08(PC),a0          ;backspace over message
  279.            bsr     print
  280.            moveq   #4,d4                 ;reset line count
  281.  
  282. next:      add.w   #274,a4               ;point to next record
  283.            sub.l   #274,d5               ;end of buffer?
  284.            bhi     secdloop              ;no, next record
  285.            bra     mainloop              ;yes, read next block
  286.  
  287. eof:       lea     txt02(PC),a0          ;print CR
  288.            bsr     print
  289.            move.l  d6,d0                 ;convert message count to ascii
  290.            bsr     hxtoa
  291.            move.l  a1,a0                 ;print message count
  292.            bsr     print
  293.            lea     txt10(PC),a0          ;point to message count text
  294.  
  295. endit:     bsr     print                 ;print message
  296.            lea     txt06(PC),a0          ;display hit any key to end
  297.            bsr     hotkey                ;and wait for key
  298.  
  299. ;***** CLEAN UP AND EXIT
  300.  
  301. cleanup:   move.l  filehand(PC),d1       ;get file handle
  302.            beq     nof                   ;skip if file is not open
  303.            calldos close                 ;close file
  304. nof:       move.l  filebuff(PC),a1       ;free file buffer ram
  305.            move.l  a1,d0
  306.            beq     nor                   ;but only if it's allocated
  307.            move.l  bufflen(PC),d0
  308.            callsys freemem
  309. nor:       move.l  doslibbase(PC),a1     ;get dos lib base
  310.            move.l  a1,d0                 ;test for zero
  311.            beq.s   \skip                 ;is it open?
  312.            callsys closelibrary          ;close if open
  313. \skip:     bsr     getmsgport            ;get message port
  314.            move.w  #20,(a2)              ;command #20 (exit door)
  315.            move.l  contport(PC),a0       ;tell MAX's that i'm finished
  316.            callsys putmsg
  317. \wait:     move.l  msgport(PC),a0        ;wait for reply
  318.            callsys waitport
  319.            move.l  msgport(PC),a0        ;get reply
  320.            callsys getmsg
  321.            tst.l   d0
  322.            beq     \wait
  323. exit3:     move.l  msgport(PC),a1        ;remove our message port
  324.            callsys remport
  325.            sub.l   d0,d0                 ;free our signal
  326.            move.l  msgport(PC),a0
  327.            move.b  15(a0),d0
  328.            callsys freesignal
  329. exit2:     move.l  msgport(PC),a1        ;free message port ram
  330.            move.l  #140,d0
  331.            callsys freemem
  332. exit1:     move.l  InitialSP(PC),sp      ;recover the stack pointer
  333.            sub.l   d0,d0
  334.            rts                           ;return
  335.        
  336. ;***** READ A SECTION NUMBER (a1) to d1
  337.  
  338. readnum:   clr.l   d1                    ;clear results
  339.            clr.l   d2
  340.            move.b  1(a1),d1              ;read second character
  341.            cmp.b   #'0',d1               ;is it a number?
  342.            blo     digit1                ;no, only 1 digit
  343.            cmp.b   #'9',d1               ;is it a number?
  344.            bhi     digit1                ;no, only 1 digit
  345.            move.b  (a1)+,d2              ;read first digit (10s)
  346.            cmp.b   #'0',d2               ;is it a number?
  347.            blo     numerr                ;no, error
  348.            cmp.b   #'9',d2               ;is it a number?
  349.            bhi     numerr                ;no error
  350.            sub.b   #$30,d2               ;convert decimal to binary
  351.            mulu    #10,d2                ;multiply by 10
  352. digit1:    move.b  (a1)+,d1              ;read next digit
  353.            cmp.b   #'0',d1               ;is it a number?
  354.            blo     numerr                ;no, error
  355.            cmp.b   #'9',d1               ;is it a number?
  356.            bhi     numerr                ;no error
  357.            sub.b   #$30,d1               ;convert decimal to binary
  358.            add.b   d2,d1                 ;add the 10s
  359.            rts                           ;return
  360. numerr:    move.b  #255,d7               ;set error flag
  361.            clr.l   d1                    ;clear result
  362.            rts                           ;return
  363.  
  364. ;***** MAKE A COLUMN OF THE LINE, (a0)=source, (a1)=dest, (a2)=ansi, d0=width
  365.  
  366. makeseg:   move.b  (a2)+,(a1)+           ;copy in ANSI color info
  367.            bne     makeseg
  368.            subq    #1,a1
  369.            subq    #1,d0
  370. \loop1:    move.b  (a0)+,d1              ;copy in info
  371.            beq     \loop2                ;end of info
  372.            move.b  d1,(a1)+
  373.            dbra    d0,\loop1             ;loop up to width
  374.            tst.b   (a1)                  ;are we at the end anyway?
  375.            beq     \loop2                ;yes, no '+'
  376.            move.b  #' ',-1(a1)           ;info is bigger than width 
  377.            move.b  #'+',-2(a1)           ;so put in a '+' indicator
  378.            rts                           ;return from subroutine
  379. \loop2:    move.b  #" ",(a1)+            ;info is smaller that width
  380.            dbra    d0,\loop2             ;so space fill the rest
  381.            rts                           ;return from subroutine
  382.  
  383. ;***** CHECK USERNAME WITH (a0), d0=0 for no match
  384.  
  385. checkusrn: moveq   #1,d0                 ;set match flag
  386.            lea     username(PC),a1       ;point to user's username
  387. loopu:     move.b  (a0)+,d1              ;read character from message username
  388.            cmp.b   #" ",d1               ;is it a space?
  389.            beq     compskip1             ;yes, dont convert
  390.            and.b   #$df,d1               ;convert to uppercase
  391. compskip1: move.b  (a1)+,d2              ;read character from username
  392.            cmp.b   #" ",d2               ;is it a space?
  393.            beq     compskip2             ;yes, dont convert
  394.            and.b   #$df,d2               ;convert to uppercase
  395. compskip2: cmp.b   d1,d2                 ;are they the same?
  396.            bne     nomatch               ;no, reset match flag and return
  397.            or.b    d1,d2                 ;both nulls? (end of username?)
  398.            bne     loopu                 ;no, check next character
  399.            rts                           ;yes, return (match)
  400. nomatch:   clr.l   d0                    ;clear match flag
  401.            rts                           ;return from subroutine
  402.  
  403. ;***** PRINT (a0)
  404.  
  405. print:     bsr     getmsgport            ;get message port
  406.            move.w  #1,(a2)+              ;command #1
  407.            clr.w   (a2)+                 ;no data
  408. ploop:     move.b  (a0)+,(a2)+           ;put print text into message
  409.            bne     ploop
  410.            bra     putwmsg               ;send the message then return
  411.  
  412. ;***** DISPLAY (a0) AND HOTKEY TO d0
  413.  
  414. hotkey:    bsr     getmsgport            ;get message port
  415.            move.w  #8,(a2)+              ;command #8
  416.            clr.w   (a2)+                 ;no data
  417. \loop:     move.b  (a0)+,(a2)+           ;copy print text into message
  418.            bne     \loop
  419.            bsr     putwmsg               ;send message to max
  420.            move.b  (a0),d0               ;read keypress
  421.            and.b   #$df,d0               ;convert to uppercase
  422.            rts                           ;return from subroutine
  423.  
  424. ;***** GET STRING INFO FROM MAX, d0=string type, result to (a3) 
  425.  
  426. getstring: bsr     getmsgport            ;get message port
  427.            move.w  #14,(a2)+             ;command #14
  428.            move.w  d0,(a2)               ;data=string type
  429.            bsr     putwmsg               ;send request to max
  430.            move.l  a3,a2                 ;store reply
  431. \loop      move.b  (a0)+,(a2)+
  432.            bne     \loop
  433.            rts                           ;return from subroutine
  434.  
  435. ;***** GET INTEGER INFO FROM MAX, d0=int type, result(.l) to (a3)
  436.  
  437. getint:    bsr     getmsgport            ;get message port
  438.            move.w  #13,(a2)+             ;command #13
  439.            move.w  d0,(a2)               ;data=int type
  440.            bsr     putwmsg               ;send request to max
  441.            sub.l   d0,d0                 ;read result
  442.            move.w  -(a0),d0
  443.            move.l  d0,(a3)               ;store result
  444.            rts                           ;return from subroutine
  445.  
  446. ;***** GET MESSAGE PORT
  447.  
  448. getmsgport:move.l  msgport(PC),a1        ;point to message port structure
  449.            move.l  a1,a2
  450.            adda.w  #34,a1                ;point a1 to message structure
  451.            adda.w  #54,a2                ;point a2 to the message data
  452.            clr.l   2(a2)                 ;clear the data field
  453.            rts                           ;return
  454.  
  455. ;***** SEND MESSAGE TO MAX's, WAIT FOR AND GET REPLY
  456.  
  457. putwmsg:   move.l  contport(PC),a0       ;point to message port structure
  458.            callsys putmsg                ;send the message to MAX's
  459. \wait:     move.l  msgport(PC),a0
  460.            callsys waitport              ;wait for reply
  461.            move.l  msgport(PC),a0
  462.            callsys getmsg                ;get reply message
  463.            tst.l   d0                    ;did we get a reply
  464.            beq     \wait                 ;no, keep waiting
  465.            move.l  d0,a0                 ;check for carrier loss
  466.            adda.w  #24,a0
  467.            tst.w   80(a0)
  468.            bne     cleanup               ;carrier loss? if so then exit
  469.            rts                           ;return
  470.  
  471. ;***** OPEN A FILE
  472.  
  473. openf:     moveq   #4,d5                 ;number of times to attempt open
  474. openloop:  lea     textbuff(PC),a0       ;point to file name
  475.            move.l  a0,d1
  476.            move.l  #mode_old,d2          ;open in read mode 
  477.            calldos open                  ;open file
  478.            tst.l   d0                    ;did it open?
  479.            bne     openok                ;yes, store handle and return
  480.            calldos ioerr                 ;no, get error code
  481.            cmp.l   #202,d0               ;is file in use?
  482.            bne     openerror             ;no, then it's a real error
  483.            move.l  #64,d1                ;wait a few secs
  484.            calldos delay
  485.            dbra    d5,openloop           ;next attempt
  486. openerror: clr.l   d0                    ;clear filehandle (error)
  487. openok:    lea     filehand(PC),a0       ;store filehandle
  488.            move.l  d0,(a0)
  489.            rts                           ;return
  490.  
  491. ;CONVERT HEX (BINARY) d0 TO ASCII (a1)
  492.  
  493. hxtoa:     tst.l   d0                    ;compliments Anthony Barrett's
  494.            bne     skp04                 ;door starter pack
  495.            lea     cbuf3(PC),a1 
  496.            move.b  #'0',(a1)
  497.            clr.b   1(a1)
  498.            rts
  499. skp04:     lea     cbuf3(PC),a1
  500.            move.l  #$30303030,d1
  501.            move.l  d1,(a1)+
  502.            move.l  d1,(a1)+
  503.            move.w  d1,(a1)
  504.            suba.w  #28,a1
  505.            move.l  d1,(a1)+
  506.            move.l  d1,(a1)+
  507.            move.w  #$3031,(a1)
  508. nxbit:     btst    #0,d0
  509.            bne     goada
  510. retur:     lsr.l   #1,d0
  511.            beq     endbit
  512.            lea     cbuf2(PC),a1
  513.            lea     cbuf1(PC),a2
  514.            move.l  (a2)+,(a1)+
  515.            move.l  (a2)+,(a1)+
  516.            move.w  (a2),(a1)
  517.            addq.l  #1,a1
  518.            addq.l  #1,a2
  519.            bsr     adasc
  520.            bra     nxbit
  521. endbit     lea     cbuf3(PC),a1
  522. lop03:     cmp.b   #$30,(a1)+
  523.            beq.s   lop03
  524.            subq.l  #1,a1
  525.            rts
  526. goada:     lea     cbuf1+9(PC),a1
  527.            lea     cbuf3+9(PC),a2
  528.            bsr     adasc
  529.            bra     retur
  530. adasc:     moveq   #9,d1
  531. next1:     move.b  (a1),d2
  532.            sub.b   #$30,d2       
  533.            add.b   d2,(a2)
  534. check:     cmp.b   #$39,(a2)
  535.            bhi     overf
  536.            subq.l  #1,a2
  537. retr2:     subq.l  #1,a1
  538.            dbf     d1,next1
  539.            rts
  540. overf:     sub.b   #10,(a2)
  541.            addq.b  #1,-(a2)
  542.            movem.l a1/a2/d1,-(sp)
  543.            sub.l   d1,d1
  544.            bsr     check
  545.            movem.l (sp)+,d1/a2/a1
  546.            bra     retr2
  547.  
  548. ;***** DATA
  549. ;file and port names
  550.  
  551. msgportn1: dc.b    "DoorControl#",0      ;message port name
  552. msgportn2: dc.b    "DoorReply#",0        ;message port name
  553. doslibname:dc.b    "dos.library",0       ;dos library name
  554. msgname:   dc.b    "Message.data",0      ;message base file name
  555.  
  556. ;error messages
  557.  
  558. txt01:     dc.b    13,"Illegal message section selection format",13,0
  559. txt03:     dc.b    13,"Error accessing MAXsBBS config file",13,0
  560. txt04:     dc.b    13,"Error accessing Message base",13,0
  561. txt07:     dc.b    13,"Error allocating RAM",13,0
  562.  
  563. ;text
  564.  
  565. txt02:     dc.b    $1b,"[0m",13,0
  566. txt06:     dc.b    13,"Hit any key to continue",0
  567. txt08:     dc.b    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
  568.            dc.b    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0
  569. txt09:     dc.b    $1b,"[0;1;33mHit <RETURN> to continue (S - stop)... ",0
  570. txt10:     dc.b    " messages were listed.",13,0
  571. txt11:     dc.b    $1b,"[1;37m---------------------------------------",0
  572.            align.l
  573.  
  574. ;storage
  575.  
  576. msgport:   dc.l    0                     ;message port
  577. contport:  dc.l    0                     ;control port pointer
  578. doslibbase:dc.l    0                     ;dosbase store
  579. InitialSP: dc.l    0                     ;stack pointer store
  580. filehand:  dc.l    0                     ;file handle
  581. accessl:   dc.l    0                     ;access level
  582. pagelen:   dc.l    0                     ;page length
  583. filebuff:  dc.l    0                     ;file buffer pointer
  584. username:  blk.b   44,0                  ;username
  585. textbuff:  blk.b   128,0                 ;text buffer
  586. cbuf1:     blk.b   10,0                  ;hex to acsii conversion ram
  587. cbuf2:     blk.b   10,0
  588. cbuf3:     blk.b   12,0
  589. sections:  blk.b   100,0                 ;section selection list
  590.            align
  591.  
  592. ;file buffer length
  593.  
  594.            dc.b    " File buffer length, must be a multiple of 274 (binary):"
  595. bufflen:   dc.l    274*100               ;read 100 messages at a time
  596.            
  597. ;hex editable text           
  598.  
  599.            dc.b    "You can hex edit these strings, all must be 0 terminated",13
  600.            dc.b    "MAXs CONFIG FILE NAME:"
  601. confname:  dc.b    "MAXsBBS.Config",0,0,0,0,0,0,0,0,0,0,0,0,0
  602.            dc.b    "HEADING TEXT:"
  603. txt05:     dc.b    $1b,"[H",$1b,"[2J",$1b,"[0;1;37mMSG No. FROM:               "
  604.            dc.b    "TO:                 SUBJECT:",13,0,0,0,0,0,0,0
  605.            dc.b    "MSG No. COLOR:"
  606. color1:    dc.b    $1b,"[0;32m",0,0,0,0,0
  607.            dc.b    "TO COLOR:"
  608. color2:    dc.b    $1b,"[0;37m",0,0,0,0,0
  609.            dc.b    "FROM COLOR:"
  610. color3:    dc.b    $1b,"[0;37m",0,0,0,0,0
  611.            dc.b    "SUBJECT COLOR:"
  612. color4:    dc.b    $1b,"[0;36m",0,0,0,0,0
  613.            
  614.            end
  615.  
  616.